package com.ruixun.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruixun.common.PageData;
import com.ruixun.entity.SysMenu;
import com.ruixun.mapper.SysMenuMapper;
import com.ruixun.query.SysMenuPageQuery;
import com.ruixun.rvo.SysMenuRvo;
import com.ruixun.service.SysMenuService;
import com.ruixun.utils.PageUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 菜单服务实现类
 * @author ruixun
 */
@Service
@RequiredArgsConstructor
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {

    private final SysMenuMapper menuMapper;

    @Override
    public PageData<SysMenuRvo> getMenuPage(SysMenuPageQuery query) {
        // 构建分页对象
        Page<SysMenu> page = new Page<>(query.getPageNum(), query.getPageSize());

        // 构建查询条件
        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysMenu::getDeleted, 0); // 未删除的数据

        // 菜单名称模糊查询
        if (StringUtils.hasText(query.getMenuName())) {
            wrapper.like(SysMenu::getMenuName, query.getMenuName());
        }

        // 菜单类型等值查询
        if (query.getMenuType() != null) {
            wrapper.eq(SysMenu::getMenuType, query.getMenuType());
        }

        // 父级菜单ID查询
        if (query.getParentId() != null) {
            wrapper.eq(SysMenu::getParentId, query.getParentId());
        }

        // 排序（按排序号升序，创建时间倒序）
        wrapper.orderByAsc(SysMenu::getSortOrder)
               .orderByDesc(SysMenu::getCreateTime);

        // 执行分页查询
        IPage<SysMenu> menuPage = menuMapper.selectPage(page, wrapper);

        // 转换结果
        List<SysMenuRvo> rvoList = menuPage.getRecords().stream()
                .map(this::convertToRvo)
                .collect(Collectors.toList());

        return new PageUtils<SysMenuRvo>().convert( menuPage.getCurrent(), menuPage.getSize(),menuPage.getTotal(),rvoList);
    }

    @Override
    public boolean addMenu(SysMenu menu) {
        return save(menu);
    }

    @Override
    public boolean updateMenu(SysMenu menu) {
        return updateById(menu);
    }

    @Override
    public boolean deleteMenu(Long id) {
        SysMenu menu = getById(id);
        if (menu != null) {
            menu.setDeleted(1); // 逻辑删除
            return updateById(menu);
        }
        return false;
    }

    @Override
    public SysMenuRvo getMenuById(Long id) {
        SysMenu menu = getById(id);
        return menu != null ? convertToRvo(menu) : null;
    }

    /**
     * 实体类转换为返回视图对象
     * @param menu 菜单实体
     * @return 返回视图对象
     */
    private SysMenuRvo convertToRvo(SysMenu menu) {
        SysMenuRvo rvo = new SysMenuRvo();
        BeanUtils.copyProperties(menu, rvo);
        return rvo;
    }

    @Override
    public List<SysMenuRvo> userMenu() {
        //获取当前登录用户ID,查询当前登录用户对应的菜单
        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysMenu::getDeleted, 0);
        List<SysMenu> sysMenus = menuMapper.selectList(wrapper);
        List<SysMenuRvo> dataList = sysMenus.stream().map(this::convertToRvo).collect(Collectors.toList());
        return dataList;
    }
}